import 'package:flutter/material.dart';

// 产品对象
class Product {
  const Product({required this.name});

  final String name;
}

// typeof:???
typedef CartChangedCallback = Function(Product product, bool inCart);

// 购物车对象：无状态的widget，将构造函数接受的值存储到final变量中，然后在build()函数中使用
class ShoppingListItem extends StatelessWidget {
  ShoppingListItem({
    required this.product,
    required this.inCart,
    required this.onCartChanged
  }) : super(key: ObjectKey(product));

  final Product product;
  final bool inCart;
  final CartChangedCallback onCartChanged;

  // 获取颜色
  Color _getColor(BuildContext context) {
    return inCart ? Colors.black54 : Theme.of(context).primaryColor;
  }

  // 文本样式
  TextStyle ? _getTextStyle(BuildContext context) {
    if (!inCart) return null;

    return const TextStyle(
      color: Colors.black54,
      decoration: TextDecoration.lineThrough
    );
  }

  @override
  Widget build(BuildContext context) {
    return ListTile(
      // 鼠标移入事件
      // 当用户点击时，widget不会直接改变inCart的值，而是通过调用从父widget接收到的onCartChanged函数
      // 这种方式可以在组件生命周期中存储的状态更长久，从而使状态持久化，甚至widget传给runApp()的状态可以持久到整个应用的生命周期
      onTap: () {
        onCartChanged(product, inCart);
      },
      leading: CircleAvatar(backgroundColor: _getColor(context),
      child: Text(product.name[0]),),
      title: Text(product.name, style: _getTextStyle(context),),
    );
  }
}


class Q0106 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(body: Center(child: ShoppingListItem(inCart: true, product: const Product(name: 'Chips'), onCartChanged: (product, inCart) {
        print('MyButton was tapped: $product[name], $inCart, ');
      },),),),
    );
  }
}
